import numpy as np
import cv2 as cv
import os

def initialize_camera(camera_id=0):
    """
    初始化摄像头
    
    参数:
        camera_id: 摄像头ID，默认为0（通常是内置摄像头）
    
    返回:
        成功时返回摄像头对象，失败时返回None
    """
    cap = cv.VideoCapture(camera_id)
    if not cap.isOpened():
        print(f"错误：无法打开摄像头 ID {camera_id}")
        return None
    return cap

def initialize_video_writer(output_path, fourcc_code='XVID', fps=20.0, frame_size=(640, 480)):
    """
    初始化视频写入器
    
    参数:
        output_path: 输出视频文件路径
        fourcc_code: 视频编码器代码，默认为'XVID'
        fps: 帧率，默认为20.0
        frame_size: 帧大小，默认为(640, 480)
    
    返回:
        成功时返回视频写入器对象，失败时返回None
    """
    # 确保输出目录存在
    output_dir = os.path.dirname(output_path)
    if output_dir and not os.path.exists(output_dir):
        try:
            os.makedirs(output_dir)
            print(f"已创建输出目录: {output_dir}")
        except OSError as e:
            print(f"错误：无法创建输出目录: {e}")
            return None
    
    # 创建视频写入器
    try:
        fourcc = cv.VideoWriter_fourcc(*fourcc_code)
        out = cv.VideoWriter(output_path, fourcc, fps, frame_size)
        if not out.isOpened():
            print(f"错误：无法创建视频写入器")
            return None
        return out
    except Exception as e:
        print(f"错误：初始化视频写入器时出错: {e}")
        return None

def process_frame(frame):
    """
    处理视频帧（可以在此添加自定义处理逻辑）
    
    参数:
        frame: 输入视频帧
    
    返回:
        处理后的视频帧
    """
    # 在这里可以添加帧处理逻辑，如滤镜、翻转等
    # 示例：取消注释下面的行以翻转帧
    # frame = cv.flip(frame, 0)  # 0表示沿x轴翻转
    return frame

def capture_and_save_video():
    """
    主函数：从摄像头捕获视频并保存到文件
    """
    # 初始化摄像头
    cap = initialize_camera(0)
    if cap is None:
        return
    
    # 初始化视频写入器
    output_path = os.path.join('..', 'test_datas', 'output.avi')
    out = initialize_video_writer(output_path)
    if out is None:
        cap.release()
        return
    
    print(f"开始捕获视频。按'q'键退出...")
    print(f"视频将保存到: {os.path.abspath(output_path)}")
    
    try:
        while cap.isOpened():
            # 捕获一帧视频
            ret, frame = cap.read()
            
            # 检查帧是否正确读取
            if not ret:
                print("无法接收视频帧（视频流结束？）。退出中...")
                break
            
            # 处理帧
            processed_frame = process_frame(frame)
            
            # 写入处理后的帧
            out.write(processed_frame)
            
            # 显示处理后的帧
            cv.imshow('视频捕获', processed_frame)
            
            # 等待按键，如果是'q'则退出
            if cv.waitKey(1) == ord('q'):
                print("用户按下'q'键，退出中...")
                break
    
    except Exception as e:
        print(f"错误：视频处理过程中出错: {e}")
    
    finally:
        # 释放资源
        cap.release()
        out.release()
        cv.destroyAllWindows()
        print("已释放所有资源")

if __name__ == "__main__":
    capture_and_save_video()